package com.itheima.listener;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;
/** 消息拒收并不重回队列*/
@Component
public class DlxListener implements ChannelAwareMessageListener {
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        // 0、获取消息的标签
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            // 1、接收转换消息
            System.out.println("1、接收消息:" + (new String(message.getBody())));

            // 2、处理业务逻辑
            System.out.println("2、处理业务逻辑...");

            // 模拟错误
            int i = 3/0;

            // 3、手动签收
            /*basicAck(long deliveryTag, boolean multiple)
             * 1、deliveryTag：接收到消息的标签
             * 2、multiple：是否签收多条消息 true:多条 false:仅当前deliveryTag所对应的消息
             * */
            channel.basicAck(deliveryTag,true);
        }catch (Exception e){
            // 4、出现异常,拒绝签收
            /*basicNack(long deliveryTag, boolean multiple, boolean requeue)
            * 1、deliveryTag：接收到的消息的标签
            * 2、multiple：是否拒绝签收多条消息
            * 3、requeue：重回队列。如果设置为true,则消息重新回到queue,broker会重新发送该消息给消费者
            * */
            System.out.println("出现异常,拒绝接收");
            channel.basicNack(deliveryTag,true,false);
        }
    }
}
